#include "Scene.h"

void Scene_Tour_Suivant(t_liste* pRattaupe, t_motte** pMotte, SDL_Surface* ecran, int32_t* eJeufin, SOCKET csock){
	/* S'occupe du déplacement des rattaupes à chaque tour */
	int eRattaupesNb=1;
	int ePosX, ePosY;
	t_rattaupes Rattaupe, RattaupeMere;
	char *sCommande=(char*)malloc(10*sizeof(char));
	char Deplacement[100], DeplacementPos[80], Procreation[70], Sante[15], Suivre[70], Grandir[70];
	SDL_Surface *SDL_Texte = NULL, *SDL_Clean = NULL;
	
	RattaupeMere.ePosX=0;
	en_tete(pRattaupe);

	while(!hors_liste(pRattaupe)){ /* On s'occupe des rats-taupes un par un */
		valeur_elt(pRattaupe,&Rattaupe);
		Rattaupe_Focus(ecran, Rattaupe);
		ePosX=Rattaupe.ePosX;
		ePosY=Rattaupe.ePosY;
		SDL_Rect_Blanc(ecran,SDL_Clean, 15, 310, 0, HAUTEUR_FENETRE+35); /* Nettoyage du déplacement */
		SDL_Rect_Blanc(ecran,SDL_Clean, 20, 85, LARGEUR_FENETRE-85, HAUTEUR_FENETRE); /* Nettoyage de la santé */
		SDL_Rect_Blanc(ecran,SDL_Clean, 15, 345, 5, HAUTEUR_FENETRE+55); /* Nettoyage de la gestation */
    		SDL_Flip(ecran);
		if(Rattaupe.Age==Adulte){
			RattaupeMere=Rattaupe;
			if(bDeplacement_possible(pMotte,ePosX,ePosY)){
				if(Rattaupe.Sexe==Male){
					sprintf(Deplacement, "Entrez le déplacement de votre taupe mâle n°%i",eRattaupesNb);
					SDL_Ecrire(ecran, SDL_Texte, Deplacement, 5, HAUTEUR_FENETRE+35);
				}
				else {
					sprintf(Deplacement, "Entrez le déplacement de votre taupe femelle n°%i",eRattaupesNb);
					SDL_Ecrire(ecran, SDL_Texte, Deplacement, 5, HAUTEUR_FENETRE+35);
					sprintf(Procreation, "Temps avant de pouvoir procréer : %i tours",6-Rattaupe.eDelaiGrossesse);
					SDL_Ecrire(ecran, SDL_Texte, Procreation, 5, HAUTEUR_FENETRE+55);
				}

				sprintf(Sante, "Sante : %i%%",Rattaupe.eSante);
				SDL_Ecrire(ecran, SDL_Texte, Sante, LARGEUR_FENETRE-80, HAUTEUR_FENETRE+5);
				SDL_Flip(ecran);

				sDeplacEcrire(sCommande,ecran,Rattaupe,pMotte,pRattaupe,eJeufin,csock);
				while(!bDeplacement_possible_dir(pMotte,ePosX,ePosY,sCommande)){
					sprintf(DeplacementPos, "Déplacement impossible");
					SDL_Ecrire(ecran, SDL_Texte, DeplacementPos, LARGEUR_FENETRE-150, HAUTEUR_FENETRE+55);
					SDL_Flip(ecran);
					sDeplacEcrire(sCommande,ecran,Rattaupe,pMotte,pRattaupe,eJeufin,csock);
					/* Nettoyage: Déplacement impossible */
					SDL_Rect_Blanc(ecran,SDL_Clean, 20, 140, LARGEUR_FENETRE-150, HAUTEUR_FENETRE+55);
					SDL_Flip(ecran);
				}
				Rattaupes_deplacement(pRattaupe, pMotte, ePosX, ePosY, sCommande, ecran);
			}
			else {
				sprintf(Deplacement, "Votre taupe ne peut pas bouger");
				SDL_Ecrire(ecran, SDL_Texte, Deplacement, LARGEUR_FENETRE-180, HAUTEUR_FENETRE+55);
				SDL_Flip(ecran);
				sleep(2);
				SDL_Rect_Blanc(ecran,SDL_Clean, 20, 180, LARGEUR_FENETRE-180, HAUTEUR_FENETRE+55);/* Nettoyage: Taupe ne peut bouger */
				SDL_Flip(ecran);
				}
		}
		else {
			pMotte[ePosX][ePosY].eTaupes-=1;
			/* On vérifie ici si la mère n'est pas morte en vérifiant si elle est autour du Rattaupe et juste avant dans la liste */
			if(RattaupeMere.ePosX!=0&&RattaupeMere.eDelaiGrossesse<=3&&RattaupeMere.Age==Adulte&&RattaupeMere.Sexe==Femelle&&((RattaupeMere.ePosX==ePosX&&RattaupeMere.ePosY==ePosY)||((RattaupeMere.ePosX==ePosX+1||RattaupeMere.ePosX==ePosX-1||RattaupeMere.ePosX==ePosX)&&(RattaupeMere.ePosY==ePosY+1||RattaupeMere.ePosY==ePosY-1||RattaupeMere.ePosY==ePosY)))){
				sprintf(Suivre, "Votre jeune taupe (%i,%i) va suivre sa mère",ePosX,ePosY);
				SDL_Ecrire(ecran, SDL_Texte, Suivre, 5, HAUTEUR_FENETRE+35);
				
				pMotte[RattaupeMere.ePosX][RattaupeMere.ePosY].eTaupes+=1;
				Rattaupe.ePosX=RattaupeMere.ePosX;
				Rattaupe.ePosY=RattaupeMere.ePosY;
				modif_elt(pRattaupe,Rattaupe);

				sprintf(Grandir, "Encore %i tours avant que votre jeune taupe ne devienne adulte",4-Rattaupe.eGestation);
				SDL_Ecrire(ecran, SDL_Texte, Grandir, 5, HAUTEUR_FENETRE+55);
				SDL_Flip(ecran);
			}
			else {
				sprintf(Grandir, "La mère du petit est morte, il ne peut survivre seul !");
				SDL_Ecrire(ecran, SDL_Texte, Grandir, 5, HAUTEUR_FENETRE+35);
				SDL_Flip(ecran);
				oter_elt(pRattaupe);
			}
		sleep(2);
		}
		Vue_afficher(pMotte,ecran);
		SDL_Flip(ecran);
		eRattaupesNb++;
		suivant(pRattaupe);
	}

	free(sCommande);
	SDL_FreeSurface(SDL_Texte);
	SDL_FreeSurface(SDL_Clean);
}

void sDeplacEcrire (char *sCommande, SDL_Surface* ecran, t_rattaupes Rattaupe, t_motte** pMotte, t_liste* pRattaupe, int32_t* eJeufin, SOCKET csock){
	/* SDL event attendant que le joueur écrive une touche correspondante au switch pour le déplacement */
	SDL_Event event;
	int continuer = 1;

	while (continuer)
	{
		SDL_WaitEvent(&event);
		switch(event.type)
		{
			case SDL_QUIT:
				free(sCommande);
				Quitter(eJeufin,pMotte,pRattaupe,csock);
				exit(EXIT_SUCCESS);
				break;
			case SDL_KEYDOWN:
				switch(event.key.keysym.sym)
				{
					case SDLK_ESCAPE:
						Proposer_Quitter_enjeu(pMotte,pRattaupe,eJeufin,ecran,csock);
						Vue_afficher(pMotte,ecran);
						Rattaupe_Focus(ecran, Rattaupe);
						SDL_Flip(ecran);
						break;
					case SDLK_UP:
						strcpy(sCommande, "haut");
						continuer=0;
						break;
					case SDLK_DOWN:
						strcpy(sCommande, "bas");
						continuer=0;
						break;
					case SDLK_RIGHT:
						strcpy(sCommande, "droite");
						continuer=0;
						break;
					case SDLK_LEFT:
						strcpy(sCommande, "gauche");
						continuer=0;
						break;
					case SDLK_SPACE:
						strcpy(sCommande, "vide");
						continuer=0;
						break;
					default:
						break;
				}
			   break;
		}
	}

}

int bDeplacement_possible(t_motte** pMotte, int ePosX, int ePosY){
	/* Regarde si le rattaupe peut se déplacer ou non */
	if(pMotte[ePosX+1][ePosY].eTaupes<2&&pMotte[ePosX+1][ePosY].eEtatterre!=Pierre) return 1;
	if(pMotte[ePosX][ePosY+1].eTaupes<2&&pMotte[ePosX][ePosY+1].eEtatterre!=Pierre) return 1;
	if(pMotte[ePosX-1][ePosY].eTaupes<2&&pMotte[ePosX-1][ePosY].eEtatterre!=Pierre) return 1;
	if(pMotte[ePosX][ePosY-1].eTaupes<2&&pMotte[ePosX][ePosY-1].eEtatterre!=Pierre)	return 1;

	return 0;
}

int bDeplacement_possible_dir(t_motte** pMotte, int ePosX, int ePosY, char* sCommande){
	/* Vérifie que le déplacement demandé par l'utilisateur est possible */
	if(strcmp(sCommande,"haut")==0){
		if(pMotte[ePosX-1][ePosY].eTaupes<2&&pMotte[ePosX-1][ePosY].eEtatterre!=Pierre) return 1;
	}
	else if (strcmp(sCommande,"bas")==0){
		if(pMotte[ePosX+1][ePosY].eTaupes<2&&pMotte[ePosX+1][ePosY].eEtatterre!=Pierre) return 1;
	}
	else if (strcmp(sCommande,"gauche")==0){
		if(pMotte[ePosX][ePosY-1].eTaupes<2&&pMotte[ePosX][ePosY-1].eEtatterre!=Pierre) return 1;
	}
	else if (strcmp(sCommande,"droite")==0){
		if(pMotte[ePosX][ePosY+1].eTaupes<2&&pMotte[ePosX][ePosY+1].eEtatterre!=Pierre) return 1;
	}
	else if(strcmp(sCommande,"vide")==0){
		return 1;
	}

	return 0;
}

void Rattaupes_deplacement(t_liste* pRattaupe, t_motte** pMotte, int ePosX, int ePosY, char* sCommande, SDL_Surface* ecran){
	/* S'occupe de déplacer le rattaupe en fonction de la demande de l'utilisateur */
	t_rattaupes Rattaupe;
	
	pMotte[ePosX][ePosY].eTaupes-=1;
	valeur_elt(pRattaupe,&Rattaupe);

	if(strcmp(sCommande,"haut")==0){
		ePosX-=1;
		Rattaupe.ePosX=ePosX;
		Rattaupe.ePosY=ePosY;
		
	}
	else if (strcmp(sCommande,"bas")==0){
		ePosX+=1;
		Rattaupe.ePosX=ePosX;
		Rattaupe.ePosY=ePosY;
	}
	else if (strcmp(sCommande,"gauche")==0){
		ePosY-=1;
		Rattaupe.ePosX=ePosX;
		Rattaupe.ePosY=ePosY;
	}
	else if (strcmp(sCommande,"droite")==0){
		ePosY+=1;
		Rattaupe.ePosX=ePosX;
		Rattaupe.ePosY=ePosY;
	}
	else if (strcmp(sCommande,"vide")==0){
		Rattaupe.eSante+=10;
	}

	modif_elt(pRattaupe,Rattaupe);
	pMotte[ePosX][ePosY].eTaupes+=1;
	Rattaupes_absorption(pRattaupe, pMotte, ePosX, ePosY, ecran);
}

void Rattaupes_absorption(t_liste* pRattaupe, t_motte** pMotte, int ePosX, int ePosY, SDL_Surface* ecran){
	/* S'occupe de l'absorption des mottes de terre par les déplacements des rattaupes */
	if(pMotte[ePosX][ePosY].eEtatterre!=Pierre&&pMotte[ePosX][ePosY].eEtatterre!=Rien){
		switch (pMotte[ePosX][ePosY].eEtatterre){
			case Plein : 	pMotte[ePosX][ePosY].eEtatterre=Moyen;
					break;
			case Moyen :	pMotte[ePosX][ePosY].eEtatterre=Petit;
					break;
			case Petit : 	pMotte[ePosX][ePosY].eEtatterre=Rien;
					break;
			default:
					break;
		}
		Nourriture_absorption(pRattaupe, pMotte, ePosX, ePosY, ecran);
	}
}

void Nourriture_absorption (t_liste* pRattaupe, t_motte** pMotte, int ePosX, int ePosY, SDL_Surface* ecran){
	/* S'occupe de l'absorption de la nourriture lors des déplacements des rattaupes + supprime la nourriture ingérée et sante à 100% */
	t_rattaupes Rattaupe;
	char Nourrir[70];
	SDL_Surface *SDL_Texte = NULL, *SDL_Clean = NULL;
	
	valeur_elt(pRattaupe,&Rattaupe);

	SDL_Rect_Blanc(ecran,SDL_Clean, 15, 190, LARGEUR_FENETRE-190, HAUTEUR_FENETRE+25);
	if(pMotte[ePosX][ePosY].Nourriture!=Vide){
		switch(pMotte[ePosX][ePosY].Nourriture){
			case Ver : sprintf(Nourrir, "          Votre taupe a mangé un ver"); Rattaupe.eSante+=40; break;
			case Plante : sprintf(Nourrir, "  Votre taupe a mangé une plante"); Rattaupe.eSante+=30; break;
			case Poison : sprintf(Nourrir, "  Votre taupe a mangé du poison"); Rattaupe.eSante-=20; break;
			case Vivifiant : sprintf(Nourrir, "  Votre taupe a mangé du vivifiant"); Rattaupe.eSante+=60; break;
			case Plante_seche : sprintf(Nourrir, "  Votre taupe a mangé une plante sèche"); Rattaupe.eSante+=10; break;
			case Non_comestible : sprintf(Nourrir, "  Votre taupe a mangé une plante avariée"); Rattaupe.eSante-=10; break;
			default: break;
		}

		/* eSante à 120 car décrémenté mais rattaupe vient de se nourrir donc il devient à 100% au début du tour */
		pMotte[ePosX][ePosY].Nourriture=Vide;
		pMotte[ePosX][ePosY].ptNourriture=0;
		modif_elt(pRattaupe,Rattaupe);
	}

	SDL_Ecrire(ecran, SDL_Texte, Nourrir, LARGEUR_FENETRE-205, HAUTEUR_FENETRE+25);
	SDL_Flip(ecran);
	SDL_FreeSurface(SDL_Texte);
	SDL_FreeSurface(SDL_Clean);
}

void Recevoir_mort(t_motte** pMotte, SDL_Surface* ecran, SOCKET sock){
	/* S'occupe de recevoir les morts avec leurs positions pour les afficher sur l'écran */
	SDL_Surface *SDL_Texte = NULL, *SDL_Clean = NULL;
	char Mort[60];
	int eCompteurinfos=0;
	int32_t eMortsPosX=0, eMortsPosY=0;
	char cMortInfo='x';

	recv(sock, &cMortInfo, sizeof(cMortInfo), 0);
	
	if(cMortInfo=='o'){
		while(eMortsPosX!=999){
			recv(sock, (char *)&eMortsPosX, sizeof(eMortsPosX), 0);
			recv(sock, (char *)&eMortsPosY, sizeof(eMortsPosY), 0);
			eMortsPosX = ntohl(eMortsPosX);
			eMortsPosY = ntohl(eMortsPosY);
			if(eMortsPosX!=999){
				Vue_Mort(eMortsPosX,eMortsPosY, ecran);
				eCompteurinfos++;
			}
		}

		if(eCompteurinfos==1)
		   sprintf(Mort, "%i de vos rattaupes est mort !", eCompteurinfos);
		if(eCompteurinfos>1)
		   sprintf(Mort, "%i de vos rattaupes sont morts !", eCompteurinfos);

		SDL_Rect_Blanc(ecran,SDL_Clean, ESPACE_MENU-35, LARGEUR_FENETRE, 0, HAUTEUR_FENETRE+35); /* Vidage quasi entier du menu */
		SDL_Rect_Blanc(ecran,SDL_Clean, ESPACE_MENU, 190, LARGEUR_FENETRE-190, HAUTEUR_FENETRE);
		SDL_Ecrire(ecran, SDL_Texte, Mort, 5, HAUTEUR_FENETRE+35);
		SDL_Flip(ecran);
		sleep(2);
		Vue_afficher(pMotte,ecran);
		SDL_Flip(ecran);
	}
	
	SDL_FreeSurface(SDL_Texte);
	SDL_FreeSurface(SDL_Clean);

}

void Recevoir_Reproduction(t_motte** pMotte, SDL_Surface* ecran, SOCKET sock){
	/* S'occupe de recevoir les reproductions avec leurs positions pour les afficher sur l'écran */
	SDL_Surface *SDL_Texte = NULL, *SDL_Clean = NULL;
	char Reproduction[100];
	int32_t eReproductionPosX=0, eReproductionPosY=0;
	char cReproductionInfo='x';

	recv(sock, &cReproductionInfo, sizeof(cReproductionInfo), 0);
	
	if(cReproductionInfo=='o'){
		while(eReproductionPosX!=999){
			recv(sock, (char *)&eReproductionPosX, sizeof(eReproductionPosX), 0);
			recv(sock, (char *)&eReproductionPosY, sizeof(eReproductionPosY), 0);
			eReproductionPosX = ntohl(eReproductionPosX);
			eReproductionPosY = ntohl(eReproductionPosY);
			if(eReproductionPosX!=999){
				sprintf(Reproduction, "Votre femelle (%i,%i) accouchera d'un bébé dans %i tours",eReproductionPosX,eReproductionPosY,3);
				SDL_Ecrire(ecran, SDL_Texte, Reproduction, LARGEUR_FENETRE-335, HAUTEUR_FENETRE+ESPACE_MENU-20);
				Vue_Reproduction(eReproductionPosX,eReproductionPosY, ecran);
				sleep(2);
				SDL_Rect_Blanc(ecran,SDL_Clean, 20, 335, LARGEUR_FENETRE-335, HAUTEUR_FENETRE+ESPACE_MENU-20); /* Nettoyage:Enceinte */
				Vue_afficher(pMotte,ecran);
				SDL_Flip(ecran);
			}
		}
	}

	SDL_FreeSurface(SDL_Texte);
	SDL_FreeSurface(SDL_Clean);

}

void Recevoir_Accouchement(t_motte** pMotte, SDL_Surface* ecran, SOCKET sock){
	/* S'occupe de recevoir les accouchements avec leurs positions pour les afficher sur l'écran */
	SDL_Surface *SDL_Texte = NULL, *SDL_Clean = NULL;
	char Accoucher[100];
	int32_t eAccoucherPosX, eAccoucherPosY;
	char cAccoucherInfo='x';

	recv(sock, &cAccoucherInfo, sizeof(cAccoucherInfo), 0);
	
	if(cAccoucherInfo=='o'){
		while(eAccoucherPosX!=999){
			recv(sock, (char *)&eAccoucherPosX, sizeof(eAccoucherPosX), 0);
			recv(sock, (char *)&eAccoucherPosY, sizeof(eAccoucherPosY), 0);
			eAccoucherPosX = ntohl(eAccoucherPosX);
			eAccoucherPosY = ntohl(eAccoucherPosY);
			if(eAccoucherPosX!=999){
				Vue_Accouchement( eAccoucherPosX, eAccoucherPosY, ecran);
				sprintf(Accoucher, "Un bébé est né dans votre tribu (%i,%i)",eAccoucherPosX,eAccoucherPosY);
				SDL_Ecrire(ecran, SDL_Texte, Accoucher, LARGEUR_FENETRE-230, HAUTEUR_FENETRE+ESPACE_MENU-20);
				SDL_Flip(ecran);
				sleep(2);
				/* Nettoyage : Accouchement */
				SDL_Rect_Blanc(ecran,SDL_Clean, 20, 250, LARGEUR_FENETRE-230, HAUTEUR_FENETRE+ESPACE_MENU-20); 
				Vue_afficher(pMotte,ecran);
				SDL_Flip(ecran);
			}
		}
	}

	SDL_FreeSurface(SDL_Texte);
	SDL_FreeSurface(SDL_Clean);

}
